package models

import (
	"card/dao"
	"card/pkg/database"
	"card/pkg/util"
	"context"
	"gorm.io/gorm"
)

const TableNameMember = "member"

// Member mapped from table <member>
type Member struct {
	ID         int64     `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"`
	Tel        string    `gorm:"column:tel;not null;comment:电话" json:"tel"`                         // 电话
	CreatedAt  LocalTime `gorm:"column:created_at;comment:注册时间" json:"created_at"`                  // 注册时间
	LoginTime  LocalTime `gorm:"column:login_time;comment:登录时间" json:"login_time"`                  // 登录时间
	Amount     float64   `gorm:"column:amount;not null;default:0.00;comment:账户余额" json:"amount"`    // 账户余额
	Password   string    `gorm:"column:password;not null;comment:密码" json:"password"`               // 密码
	Points     float64   `gorm:"column:points;not null;default:0.00;comment:积分" json:"points"`      // 积分
	Avatar     string    `gorm:"column:avatar;not null;comment:个人图像" json:"avatar"`                 // 个人图像
	Level      int8      `gorm:"column:level;not null;comment:级别" json:"level"`                     // 级别
	Pid        int64     `gorm:"column:pid;not null;comment:推荐人id" json:"pid"`                      // 推荐人id
	Nickname   string    `gorm:"column:nickname;not null;comment:真实姓名" json:"nickname"`             // 昵称
	Email      string    `gorm:"column:email;not null;comment:邮箱" json:"email"`                     // 邮箱
	Status     int8      `gorm:"column:status;not null;default:1;comment:状态-1禁用，1启用" json:"status"` // 状态-1禁用，1启用
	IsAgent    int8      `gorm:"column:is_agent;not null;comment:1:代理0：会员" json:"is_agent"`         // 1:代理0：会员
	RegisterIp string    `gorm:"column:register_ip;not null;comment:注册地址ip" json:"register_ip"`     // 注册ip
	LoginIp    string    `gorm:"column:login_ip;not null;comment:登陆地址ip" json:"login_ip"`           // 登陆ip
	InviteCode string    `gorm:"column:invite_code;not null;comment:邀请码" json:"invite_code"`
}

type MemberRepo struct {
	ctx context.Context
	db  *database.DbComponent
}

func NewMemberRepo(c context.Context) *MemberRepo {
	return &MemberRepo{
		ctx: c,
		db:  database.GetDb(dao.CardDb).WithContext(c),
	}
}

// TableName Member's table name
func (*Member) TableName() string {
	return TableNameMember
}

func (m *MemberRepo) One(opts ...dao.DbOption) (info Member, err error) {
	tx := m.db.Model(&Member{})
	for _, option := range opts {
		option(tx)
	}
	err = tx.Limit(1).Find(&info).Error
	return
}

// BeforeSave GORM 的模型钩子，在创建和更新模型前调用
func (m *Member) BeforeSave(tx *gorm.DB) (err error) {
	if !util.BcryptIsHashed(m.Password) {
		m.Password = util.BcryptHash(m.Password)
	}
	return
}

func (m *MemberRepo) Create(member *Member) (int64, error) {
	err := m.db.WithContext(m.ctx).Create(&member).Error
	return member.ID, err
}

func (m *MemberRepo) Save(id int64, data map[string]interface{}) error {
	return m.db.Model(&Member{}).Where("id = ?", id).Updates(data).Error
}

func (m *MemberRepo) All(opts ...dao.DbOption) (list []Member, err error) {
	tx := m.db.Model(&Member{})
	for _, option := range opts {
		option(tx)
	}
	err = tx.Find(&list).Error
	return
}
